<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>数据劫持</title>
</head>
<body>
    
</body>
<script>
    let data={name:'cristiano',age:36}
    let _this={}
    for(let i in data){
        Object.defineProperty(_this,i,{
            get(){
                console.log('get');
                return data[i]
            },
            // 监视数据被修改，一旦被修改，就会调用 
            set(newValue){
                console.log(newValue,'set');
                // 不要在set里面修改属性的值，否则会出现死循环 这是因为一旦直接修改就调用了set方法，set方法里继续修改
                // this.name=newValue
                // 对象的键如果是变量的时候，不能直接. 必须要用[]
                // data.i=newValue
                // 因为下面修改了name属性，所以这里的i就是name
                data[i]=newValue
            }
        })
    }
    _this.name='leo'
    // Object.defineProperty的不能通过直接.来改变键值
    console.log(_this.name);
    console.log(_this);
    // 如果我们在控制台看到有的属性是...的，那么就说明他是用原生js里面的object.defineProperty方法来实现的
</script>
</html>